/**
 * @author jmdelgado
 * @classDescription Proporcia una instancia con todos los metodos necesarios para Manejar una base de datos indexedDB
 */
WebKitDev.DataBase.db = function(name) {
    try {
        /*inicialización*/
        /**
         * Nombre de la base de datos.
         * @type {string} this.dbName
         */
        this.dbName = name;
        /**
         * Indica si la base de datos está creada
         * @type {bool} this.created
         */
        this.created = false;
        /**
         * Indica si la base de datos está abierta
         * @type {bool} this.opened
         */
        this.opened = false;
        this.dbVersion = "";
        /**
         * Nombres de las tablas dentro de la base de datos.
         * @type {Array{string}} this.TableNames
         */
        this.TableNames = [];
        var indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.msIndexedDB;
        if (!indexedDB)
            throw new Error("NOTSUPPORTED: Su navegador no admite base de datos");
        if ('webkitIndexedDB' in window) {
            window.IDBTransaction = window.webkitIDBTransaction;
            window.IDBKeyRange = window.webkitIDBKeyRange;
        }

        this.dbObj = null;
        /**
         * Crea la base de datos con las tablas especidicadas
         * @param {string} description Descripción de la base de datos.
         * @param {Array{WebKitDev.Core.Structures.dbTable}} Array con los datos de indices de las tablas.
         * */
        this.CreateDB = function(description, tables) {
            if (!this.created) {
                //Abrir la base de datos:
                var request = indexedDB.open(this.dbName, description);
                request.onsuccess = function(e) {
                    this.dbObj = e.target.result;
                    this.opened = true;
                };
                request.onfailure = this.onerror;
                request.onupgradeneeded = function(e) {
                    //Crear la estructura de tablas:
                    for (var j = 0; j < tables.length; j++) {
                        var indexes = tables[j].Indexes;

                        var primary = null;
                        //Significa que la versión de la base de datos no corresponde, y por lo tanto hay que crear el object store:
                        for (var i = 0; i < indexes.length; i++) {
                            if (indexes[i].PrimaryKey) {
                                primary = mapping[i];
                                break;
                            }
                        }
                        var objectStore = null;
                        if (primary)
                            objectStore = evt.currentTarget.result.createObjectStore(tables[j].Name, {
                                keyPath : primary.Name,
                                autoIncrement : primary.AutoIncrement
                            });
                        else
                            objectStore = evt.currentTarget.result.createObjectStore(tables[j].Name, {
                                keyPath : this.Name + "_UID",
                                autoIncrement : true
                            });

                        for (var i = 0; i < mapping.length; i++) {
                            if (indexes[i].Name != primary.Name) {
                                objectStore.createIndex(indexes[i].Name, indexes[i].IndexName, {
                                    unique : indexes[i].Unique
                                });
                            }
                        }
                    }
                    this.created = true;
                };
            } else {
                throw new Error("DBCREATE: La base de datos tya fue creada, no se puede volver a invocar la creacción")
            }
        }
        /**
         * Abre la base de datos
         */
        this.OpenDB = function() {
            if (!this.opened) {
                var request = indexedDB.open(this.dbName);
                request.onsuccess = function(e) {
                    this.dbObj = e.target.result;
                    this.dbVersion = this.dbObj.version;
                    this.opened = true;
                };
                request.onfailure = this.onerror;
                request.onupgradeneeded = function(e) {
                    throw new Error("DBOPEN: La base de datos " + this.DdbName + " no se puede abrir, por que ha cambiado de versión.");
                }
            } else {
                throw new Error("DBOPEN: La base de datos ya fue abierta.");
            }
        }
        this.QueryDB = function(table, query) {
            throw new Error("not implemented");
        }
        this.InsertDB = function(Table, object) {
            throw new Error("not implemented");
        }
        this.UpdateDB = function(Table, object) {
            throw new Error("not implemented");
        }
        this.DeleteDB = function(Table, object) {
            throw new Error("not implemented");
        }
        this.ObtainTable = function(Table, object) {
            //lee todos los registros de una tabla:
            throw new Error("not implemented");
        }
        this.ObtainTableList = function() {
            //Obtiene el listado de tablas
            this.TableList = [];
            throw new Error("not implemented");
        }

        this.onerror = function(e) {
            throw new Error(e);
        };

    } catch(err) {
        switch(Error.split(':')[0]) {
            case "NOTSUPPORTED":
                alert(Error.split(':')[1]);
                break;
            case "DBCREATE":
                alert(Error.split(':')[1]);
                break;
            case "DBOPEN":
                alert(Error.split(':')[1]);
                break;
            default:
                throw err;
                break;
        }
    }
}
